AWS IoT Greengrass Core には ZIP ファイルの展開機構が組み込まれている話
実は AWS IoT Greengrass の コアパッケージである Greengrass Core(Greengrass Necleus)には、ZIP の解凍機能が独自に組み込まれています。
本記事では、その詳細と動作確認までを紹介したいと思います。
背景
これまで私は、ZIP でビルドされたアーティファクトをデバイスにデプロイする時、ZIP の展開は デプロイ対象の環境に依存するものと思っていました。
というのも Linux 環境の場合、多くのケースで zip コマンドがシステムにインストールされているので、Greengrass で ZIP のアーティファクトをデプロイするときも、Linux(デプロイ対象のマシン)環境にある ZIP コマンドを利用して展開しているものと思っていました。
しかし、Windows 環境ではコマンドプロンプトや PowerShell では、デフォルトで ZIP コマンドは利用できません。
代替案として、Windows11 では tar
コマンドで ZIP ファイルの展開ができるようで、システム環境変数のパスに tar.exe
が存在します。そのため ggc_user
でも ZIP の展開自体は可能です。また、PowerShell の Expand-Archive
コマンドも利用できるので、OS 標準の機能で ZIP を展開すること自体はできそうです。
(できそうですが、Greengrass のユースケースでどう使うのかについては工夫が必要に思います。)
一方で Greengrass のドキュメントには、次のような記載があります。
コンポーネントがインストールされると、AWS IoT Greengrass はコンポーネントのアーカイブアーティファクトをこの変数が公開するフォルダに解凍します。
この記述だけでは、アーカイブの解凍をどういう仕組みで行うのか判断できません。
しかし、Docker コンテナとしてコンポーネントを動かす場合は、「デバイスに Docker のインストールが必要」と明記されています。
もしデバイスに ZIP ファイルを展開する何らかの機構が別途必要なら、Docker のようにドキュメントにその旨の説明がありそうです。
しかし、ドキュメントにはその説明がなく「Greengrass はアーカイブを解凍する」とだけ記載されているので、Greengrass 側に 「ZIP を解凍する仕組みが組み込まれている」 と考えられます。
ソースコード
Greengrass Nucleus のソースコードは GitHub で公開されているので、上記のような仮定を元に実際のコードを確認してみると Unarchiver.java
というコードが見つかりました。
下記で Unarchiver
というクラスが定義されています。
昨年末にリリースされた Greengrass Lite においても、同様の機能が組み込まれているようです。
検証してみる
以前の記事では、アーティファクトをビルドする際に ZIP にせずにカスタムビルドで bat ファイルをそのままアーティファクトにしていました。
今回は、カスタムビルドではなく ZIP 化したアーティファクトで試してみたいと思います。
ZIP でビルドした Greengrass コンポーネントの作成
以前の記事のように GDK CLI でコンポーネントの作成を行います。対象のデバイスにはすでに Greeengrass Core がインストール済みとします。
まだインストールされていない場合は、前回の内容などを参考に準備してください。
まず次の内容で レシピ を作成します。
コンポーネント名は com.example.windowstest02
としました。
前回の記事との違いの特徴は、アーティファクトの URI に ZIP ファイルを指定し、展開方法の指定を ZIP としている点です。(Unarchive: ZIP
)
また、デプロイ後にコンポーネントを起動するパスも {artifacts:decompressedPath}
が含まれており解凍後のパスを指定しています。
---
RecipeFormatVersion: "2020-01-25"
ComponentName: "com.example.windowstest02"
ComponentVersion: "{COMPONENT_VERSION}"
ComponentDescription: "This is sample component for Windows.(zip archive Ver.)"
ComponentPublisher: "{COMPONENT_AUTHOR}"
ComponentConfiguration:
DefaultConfiguration:
Message: "World"
Manifests:
- Platform:
os: windows
Artifacts:
- Uri: "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/windowstest02.zip"
Unarchive: ZIP
Lifecycle:
run: "{artifacts:decompressedPath}/windowstest02/windowstest02.bat"
参考ドキュメントは下記になります。
gdk-config.json
もビルド方法は zip
を指定する形にします。
{
"component": {
"com.example.windowstest02": {
"author": "CM-ICHIDA",
"version": "NEXT_PATCH",
"build": {
"build_system": "zip",
"options": {
"zip_name": "windowstest02"
}
},
"publish": {
"bucket": "greengrass-windows-test-20250110",
"region": "ap-northeast-1"
}
}
},
"gdk_version": "1.6.1"
}
コンポーネントで動かす bat ファイルの内容は前回の内容のままです。
前回の記事のコンポーネントがデプロイ済みなので、区別するために出力ファイルを hardware2.txt
に変更しています。
@ECHO OFF
chcp 437
>hardware2.txt (
:: This batch file will discover the windows version we are using and store to a text file
TITLE My System Info 2
ECHO ==========================
ECHO WINDOWS INFO
ECHO ============================
systeminfo | findstr /c:"OS Name"
systeminfo | findstr /c:"OS Version"
systeminfo | findstr /c:"System Type"
)
コンポーネントのビルドとデプロイ
カスタムビルドでは無いので準備はこれだけです。
ビルド & パブリッシュします。
gdk component build
gdk component publish
com.example.windowstest02
というコンポーネントができました。
デバイスにデプロイします。
動作確認
Windows デバイス側を確認します。
AWS IoT Greengrass のワークフォルダ(C:\greengrass\v2\work\com.example.windowstest02
)に移動して、hardware2.txt
ができていることを確認できました。
デプロイ済みコンポーネントのフォルダ構成の確認
ZIP 化したものと、そうでないもの( bat ファイルをそのままデプロイしたもの)で、Windows 側のフォルダ構成を少し確認してみましょう。
( bat ファイルをそのままデプロイしたものは、前回の記事でデプロイしたコンポーネントです。)
C:\greengrass\v2\packages\artifacts
のフォルダは、S3 からダウンロードしたアーティファクトが配置されます。
com.example.windowstest01
は カスタムビルドで指定した通り bat ファイルが置かれているのに対して、com.example.windowstest02
は ZIP ファイルがダウンロードされています。
C:\greengrass\v2\packages\artifacts>tree /f
フォルダー パスの一覧: ボリューム Windows
ボリューム シリアル番号は C47A-3FCF です
C:.
├─aws.greengrass.Cli
│ └─2.14.0
│ aws.greengrass.cli.client.zip
│ aws.greengrass.Cli.jar
│
├─aws.greengrass.Nucleus
│ └─2.14.0
│ aws.greengrass.nucleus.zip
│
├─com.example.windowstest01
│ └─1.0.0
│ windowstest01.bat
│
└─com.example.windowstest02
└─1.0.0
windowstest02.zip
また、C:\greengrass\v2\packages\artifacts-unarchived
フォルダも確認してみます。このフォルダは解凍したアーティファクトが配置されます。
ZIP 化した com.example.windowstest02
フォルダには各種ファイルが展開されているの対して、com.example.windowstest01
フォルダには何もありません。アーティファクトを ZIP 化していないためですね。
C:\greengrass\v2\packages\artifacts-unarchived>tree /f
フォルダー パスの一覧: ボリューム Windows
ボリューム シリアル番号は C47A-3FCF です
C:.
├─aws.greengrass.Cli
│ └─2.14.0
│ └─aws.greengrass.cli.client
(中略)
│
├─aws.greengrass.Nucleus
│ └─2.14.0
│ └─aws.greengrass.nucleus
(中略)
├─com.example.windowstest01
│ └─1.0.0
└─com.example.windowstest02
└─1.0.1
└─windowstest02
│ .gitignore
│ README.md
│ windowstest02.bat
│
├─src
│ greeter.py
│
└─tests
test_greeter.py
最後に
Greengrass は Linux や Windows などマルチプラットフォームをサポートしています。そのため ZIP の展開機能など、コンポーネントのデプロイ時にデバイス環境に依存しない仕組みが備わっています。
デバイス環境に関係なく一貫したコンポーネントのデプロイ手法が取れるのは Greengrass の魅力の一つかと思います。
IoT 導入支援 / 相談会の紹介
クラスメソッドでは、AWS を中心とした IoT 導入においてエッジからクラウドまでトータルでサポートしています。
このようなお困りごとがあれば、お気軽にお問い合わせください。
- ローカルでデータ収集と可視化はできたが、クラウドで可視化する適切な構成が分からない
- 集めたデータを使って故障予知などに使いたい
- 工場設備からデータ収集してクラウドに送る方法が分からない
- スマートファクトリー化を検討しているが何から着手していいか分からない
- デバイスで動くアプリケーションの開発を AWS で効率化したい
- エッジデバイスのセキュリティが心配だ
- その他、お困り事があれば何でもご相談ください